package com.hdu.service.impl;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.Result;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.json.JsonData;
import com.hdu.exception.BizException;
import com.hdu.service.IndexService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;

/**
 * 课程索引管理接口实现
 *
 * @author xiaobai
 * @since 2025-02-06
 */

@Service
public class IndexServiceImpl implements IndexService {

    @Autowired
    private  ElasticsearchClient elasticsearchClient; // 使用新版 Java API Client

    /**
     * 创建文档索引（兼容 Elasticsearch 7.x/8.x）
     *
     * @param indexName 索引名称
     * @param id        文档ID
     * @param object    文档对象
     * @return 操作是否成功
     */
    public Boolean addCourseIndex(String indexName, String id, Object object) {
        try {
            // 1. 构建索引请求（Builder模式，更简洁）
            IndexRequest<Object> request = IndexRequest.of(b -> b
                    .index(indexName)
                    .id(id)
                    .document(JsonData.of(object)) // 自动序列化对象
            );

            // 2. 执行请求并获取响应
            IndexResponse response = elasticsearchClient.index(request);

            // 3. 检查操作结果（更严谨的状态判断）
            return response.result().jsonValue().equals("created")
                    || response.result().jsonValue().equals("updated");

        } catch (IOException e) {
            // 4. 异常处理（分级日志和自定义异常）
            throw new BizException("文档索引创建/更新失败:" + e.getMessage());
        }
    }

    /**
     * 更新文档索引（兼容 Elasticsearch 7.x/8.x）
     *
     * @param indexName 索引名称
     * @param id        文档ID
     * @param object    文档对象
     * @return 操作是否成功
     */
    @Override
    public Boolean updateCourseIndex(String indexName, String id, Object object) {
        try {
            // 1. 构建更新请求（Builder模式 + 自动序列化）
            UpdateRequest<Object, Object> request = UpdateRequest.of(b -> b
                    .index(indexName)
                    .id(id)
                    .doc(JsonData.of(object)) // 自动序列化对象
            );

            // 2. 执行请求并获取响应
            UpdateResponse<Object> response = elasticsearchClient.update(request, Object.class);

            // 3. 通过枚举判断结果更安全
            return response.result() == Result.Updated;

        } catch (IOException e) {
            throw new BizException("更新索引出错:" + e.getMessage());
        }
    }

    /**
     * 删除文档索引（兼容 Elasticsearch 7.x/8.x）
     *
     * @param indexName 索引名称
     * @param id        文档ID
     * @return 操作是否成功
     */
    @Override
    public Boolean deleteCourseIndex(String indexName, String id) {
        try {
            // 1. 构建删除请求
            DeleteRequest request = DeleteRequest.of(b -> b
                    .index(indexName)
                    .id(id)
            );

            // 2. 执行请求并检查结果
            DeleteResponse response = elasticsearchClient.delete(request);

            // 3. 直接返回操作状态（HTTP 404视为删除成功）
            return response.result() == Result.Deleted
                    || response.result() == Result.NotFound;

        } catch (IOException e) {
            throw new BizException("删除索引出错:" + e.getMessage());
        }
    }
}
